一張圖片勝過千言萬語
連日本知名女明星都這麼說了
你還想反駁嗎
如果現在不能理解也沒關係
繼續看繼續學只會越來越香
作為一個後端語言 PHP 的存在已經非常有歷史
算是一個非常完善的語言了
不但官方提供與許多其他服務做連接的套件
社群套件也非常豐富
那為什麼說是黑魔法呢
因為 PHP 作為一個後端語言
是不能隨意因為語法小錯誤而停止運作的
因此衍生出一種非常高的容錯機制
告訴你語法不允許卻還是讓你執行
然後丟個例外處理之類的行為
剛剛有說到 PHP 是一種弱型別語言
這是什麼意思呢
一般來說程式語言中的比較都是 ==
用來回傳兩個項目是否相等
但在弱型別語言中有 ==
與 ===
的差別
==
===
可以看看這張表
綠色的部分是預期要的行為
但其他黃色的部分明明看似不同卻能成立
紅色更不用說了 根本獵奇
我們立刻就來看個例子吧
if($a != $b && md5($a) == md5($b))
{
echo 'T';
}
在這個例子中如果 $a
一定跟 $b
不一樣的話
兩個出來的 md5 有可能相等嗎
這當然是有可能的
只是在密碼學的領域叫做碰撞
要找到一個這樣的值是機率非常低的
但從上面的語法卻不需要透過碰撞的方式就可以成立
舉以下字串來說
QNKCDZO
0e830400451993494058024219903391
240610708
0e462097431906509019562988736854
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
他們 md5 出來都後都是 0e
開頭
且是使用兩個等於的弱比較
那在比較的時候這些 0e
開頭的字串會被轉型成 int 型態
所以 0e 開頭的 int 意思是 0 的 xxx 次方
比如 0e830400451993494058024219903391
就是 0 的 830400451993494058024219903391 次方
那 0 的不管幾次方都是 0
就造成了上面的弱等於會回傳 true 了
在這邊
明明兩個完全不同的字串出來的 md5 也完全不相同
最後卻過了這項驗證被認為是相等
因此兩個等於的寫法是非常危險的